package main

import (
	"fmt"
	"net"
	"os"
	"strings"
	"sync"
	"time"
)

var (
	data sync.Map
)

func log(content string) {
	currentTime := time.Now().Format("2006-01-02 15:04:05")

	fmt.Printf("[%s] %s\n", currentTime, content)
}

func push(host, requestLog string) {
	//log("获取上报文件")
	//// 判断文件是否存在
	//_, err := os.Stat(path)
	//if os.IsNotExist(err) {
	//	log("file not found: " + path)
	//	return
	//}
	//
	//timeUnix := time.Now().Unix()
	//newPath := path + "-" + strconv.FormatInt(timeUnix, 10)
	//os.Rename(path, newPath)
	//os.Remove(path)
	//
	//// 读取文件
	//content, err := ioutil.ReadFile(newPath)
	//if err != nil {
	//	log("read file fail")
	//	return
	//}
	//lines := strings.Split(string(content), "\n")
	//if len(lines) <= 0 {
	//	log("file is empty")
	//	return
	//}
	//
	//// 逐行遍历
	//key := ""
	//url := ""
	//for _, line := range lines {
	//	content := strings.Trim(line, " ")
	//	if content == "" {
	//		continue
	//	}
	//
	//	if line[0:1] == "#" {
	//		urlPos := strings.LastIndex(line, "#URL:")
	//		if urlPos != -1 {
	//			url = line[urlPos+5:]
	//			key = line[0:urlPos]
	//		}
	//
	//		if url == "" || key == "" {
	//			continue
	//		}
	//
	//		if _, urlExists := data[url]; !urlExists && url != "" {
	//			data[url] = map[string]map[string]string{}
	//			dataS[url] = map[string][]string{}
	//		}
	//
	//		if _, dataExists := data[url][key]; !dataExists && key != "" {
	//			data[url][key] = map[string]string{}
	//			dataS[url][key] = []string{}
	//		}
	//	} else {
	//		if url == "" || key == "" {
	//			continue
	//		}
	//
	//		pos := strings.LastIndex(line, " ")
	//		if pos != -1 {
	//			index := line[0:pos]
	//			value := line[pos+1:]
	//
	//			if _, valueExists := data[url][key][index]; !valueExists {
	//				data[url][key][index] = value
	//				dataS[url][key] = append(dataS[url][key], index)
	//			} else {
	//				if strings.Contains(value, ".") {
	//					valueF, _ := strconv.ParseFloat(value, 64)
	//					dataVF, _ := strconv.ParseFloat(data[url][key][index], 64)
	//					tempVF := dataVF + valueF
	//					data[url][key][index] = strconv.FormatFloat(tempVF, 'f', -1, 64)
	//				} else {
	//					valueF, _ := strconv.ParseInt(value, 10, 64)
	//					dataVF, _ := strconv.ParseInt(data[url][key][index], 10, 64)
	//					tempVF := valueF + dataVF
	//					data[url][key][index] = strconv.FormatInt(tempVF, 10)
	//				}
	//			}
	//		}
	//	}
	//}

	// 推送数据
	//log("推送数据")
	//var (
	//	requestDataBytes []byte
	//	req              *http.Request
	//	resp             *http.Response
	//	requestURL       string
	//	requestData      string
	//	err              error
	//)
	//client := &http.Client{}
	//if len(dataS) != 0 {
	//	for uk, uv := range dataS {
	//		requestURL = host + uk
	//		requestData = ""
	//		if len(uv) != 0 {
	//			for tk, tv := range uv {
	//				requestData = requestData + tk + "\n"
	//				if len(tv) != 0 {
	//					for _, ik := range tv {
	//						if _, iExists := data[uk][tk][ik]; iExists {
	//							requestData = requestData + ik + " " + data[uk][tk][ik] + "\n"
	//						}
	//					}
	//				}
	//			}
	//		}
	//
	//		// php类名转移
	//		requestData = strings.Replace(requestData, "\\", "\\\\", -1)
	//
	//		if requestLog != "" {
	//			requestDataBytes = []byte(requestURL + "\n" + requestData)
	//			requestPath := requestLog + "/pushgateway_collector_request-" + strconv.FormatInt(timeUnix, 10) + ".log"
	//			requestFd, _ := os.OpenFile(requestPath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644)
	//			defer requestFd.Close()
	//			_, err = requestFd.Write(requestDataBytes)
	//			if err != nil {
	//				log("记录数据失败")
	//			}
	//
	//		}
	//
	//		req, err = http.NewRequest("POST", requestURL, strings.NewReader(requestData))
	//		if err != nil {
	//			log("http error")
	//		}
	//
	//		log("http start : " + requestURL)
	//		resp, err = client.Do(req)
	//		if err != nil {
	//			log(err.Error())
	//			continue
	//		} else {
	//			log(resp.Status)
	//		}
	//		defer resp.Body.Close()
	//		if resp.StatusCode >= 300 {
	//			body, _ := ioutil.ReadAll(resp.Body)
	//			log("http fail : " + string(body))
	//		} else {
	//			log("http success")
	//		}
	//	}
	//}

	//if !retain {
	//	os.Remove(newPath)
	//}
}

func unixSockServe(sockFd string) {
	os.Remove(sockFd)
	addr := &net.UnixAddr{Name: sockFd, Net: "unix"}
	listener, err := net.ListenUnix("unix", addr)
	if err != nil {
		log("ListenUnix error : " + err.Error())
		return
	}
	defer listener.Close()
	// 修改socket文件权限
	os.Chmod(sockFd, 0777)

	for {
		log("start listener")
		svr, err := listener.Accept()
		if err != nil {
			log("Accept: " + err.Error())
		} else {
			log("接收到上报数据")
			go func(svr net.Conn) {
				defer svr.Close()
				content := ""
				for {
					buf := make([]byte, 100)
					nr, err := svr.Read(buf)
					if err != nil {
						break
					}
					if nr <= 0 {
						break
					}
					content = content + string(buf[0:nr])
				}

				// 处理上报数据
				fmt.Println(content)

				//// 按行切分数据
				//lines := strings.Split(content, "\n")
				//if len(lines) <= 0 {
				//	log("file is empty")
				//	return
				//}
				//
				//itemData, _ := data.Load("item")
				//sortData, _ := data.Load("sort")
				//itemMap := itemData.(map[string]map[string]map[string]string)
				//sortMap := sortData.(map[string]map[string][]string)
				//
				//// 逐行遍历
				//key := ""
				//url := ""
				//for _, line := range lines {
				//	lineContent := strings.Trim(line, " ")
				//	if lineContent == "" {
				//		continue
				//	}
				//
				//	if line[0:1] == "#" {
				//		urlPos := strings.LastIndex(line, "# URL:")
				//		typePos := strings.LastIndex(line, "# TYPE:")
				//
				//		if urlPos != -1 {
				//			url = line[6:]
				//		}
				//
				//		if typePos != -1 {
				//			key = line[7:]
				//		}
				//
				//		if url == "" || key == "" {
				//			continue
				//		}
				//	} else {
				//		if url == "" || key == "" {
				//			continue
				//		}
				//
				//		pos := strings.LastIndex(line, " ")
				//		if pos != -1 {
				//			index := line[0:pos]
				//			value := line[pos+1:]
				//
				//			if _, valueExists := itemMap[url][key][index]; !valueExists {
				//				itemMap[url][key][index] = value
				//				sortMap[url][key] = append(sortMap[url][key], index)
				//			} else {
				//				if strings.Contains(value, ".") {
				//					valueF, _ := strconv.ParseFloat(value, 64)
				//					dataVF, _ := strconv.ParseFloat(itemMap[url][key][index], 64)
				//					tempVF := dataVF + valueF
				//					itemMap[url][key][index] = strconv.FormatFloat(tempVF, 'f', -1, 64)
				//				} else {
				//					valueF, _ := strconv.ParseInt(value, 10, 64)
				//					dataVF, _ := strconv.ParseInt(itemMap[url][key][index], 10, 64)
				//					tempVF := valueF + dataVF
				//					itemMap[url][key][index] = strconv.FormatInt(tempVF, 10)
				//				}
				//			}
				//		}
				//	}
				//}
				//
				//data.Store("item", itemMap)
				//data.Store("sort", sortMap)
				//
				//fmt.Println(content)
				//fmt.Println(itemMap)
			}(svr)
		}
	}
}

func main() {
	// 初始化全局变量
	itemData := make(map[string]map[string]map[string]string)
	sortData := make(map[string]map[string][]string)
	data.Store("item", itemData)
	data.Store("sort", sortData)

	// 获取配置
	var config = make(map[string]string)
	for k, v := range os.Args {
		if k == 0 {
			continue
		}
		splitStr := strings.Split(v, "=")
		if len(splitStr) != 2 {
			continue
		}
		config[splitStr[0]] = splitStr[1]
	}

	// 校验 host 参数
	if _, intervalExists := config["--host"]; !intervalExists {
		log("Please set config [--host]")
		return
	}

	// 校验 collectPath 参数
	if _, collectPathExists := config["--collectPath"]; !collectPathExists {
		log("Please set config [--collectPath]")
		return
	}

	// 校验 interval 参数
	if _, intervalExists := config["--interval"]; !intervalExists {
		log("Please set config [--interval]")
		return
	}

	//interval, err := strconv.Atoi(config["--interval"])
	//if err != nil {
	//	log("fetch interval error: " + err.Error())
	//	return
	//}
	//
	//requestLog := ""
	//if _, requestLogExists := config["--requestLog"]; requestLogExists {
	//	if config["--requestLog"][0:1] == "/" {
	//		requestLog = config["--requestLog"]
	//	} else {
	//		log("fetch requestLog error: Please use full path")
	//		return
	//	}
	//}

	unixSockServe(config["--collectPath"])

	//for {
	//	// 等待开始
	//	log("sleep " + config["--interval"])
	//	time.Sleep(time.Duration(interval) * time.Second)
	//
	//	log("start push")
	//	go push(config["--host"], requestLog)
	//}
}

//var (
//	addr = &net.UnixAddr{Name: "/tmp/pushgateway_collector.sock", Net: "unix"}
//)
//
//func main() {
//	os.Remove(addr.Name)
//	lis, err := net.ListenUnix("unix", addr)
//	if err != nil {
//		fmt.Println("ListenUnix", err)
//		return
//	}
//	defer lis.Close()
//	for {
//		c, err := lis.Accept()
//		if err != nil {
//			panic("Accept: " + err.Error())
//		}
//		go func(c net.Conn) {
//			defer c.Close()
//			content := ""
//			for {
//				buf := make([]byte, 100)
//				nr, err := c.Read(buf)
//				if err != nil {
//					break
//				}
//				if nr <= 0 {
//					break
//				}
//				content = content + string(buf[0:nr])
//			}
//			log(content)
//		}(c)
//	}
//}
